#include <iostream>

using namespace std;

int n,q;
#define endl '\n'
const int N = 1e5 + 10;

int lg[N];
int f[N][26];
int arr[N];

void init()
{
    for(int i = 1; i <= n; i ++)
    {
        lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
    }
    for(int i = 1; i <= n; i ++) lg[i] --;
    for(int j = 0; j < 26; j ++)
    {
        for(int i = 1; i + (1 << j) - 1 <= n; i ++)
        {
            if(!j) f[i][j] = arr[i];
            else f[i][j] = max(f[i][j - 1],f[i + (1 << j - 1)][j - 1]);
        }
    }
}

int query(int l,int r)
{
    int len = r - l + 1;
    int k = lg[len] / lg[2];
    return max(f[l][k],f[r - (1 << k) + 1][k]);
}


int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> q;
    for(int i = 1; i <= n; i ++) cin >> arr[i];
    init();
    while(q --)
    {
        int l,r;
        cin >> l >> r;
        cout << query(l,r) << endl;
    }
}